package Sessions;

import java.sql.Time;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;

import javax.ejb.Stateless;
import javax.persistence.PersistenceContext;
import javax.persistence.EntityManager;
import javax.persistence.Query;

import org.jboss.ejb3.annotation.RemoteBinding;

import EntityBeans.Abilita;
import EntityBeans.Amicizia;
import EntityBeans.EsperienzaLavorativa;
import EntityBeans.Feedback;
import EntityBeans.Indirizzo;
import EntityBeans.Necessita;
import EntityBeans.PossessoAbilita;
import EntityBeans.RichiestaAiuto;
import EntityBeans.RichiestaAmicizia;
import EntityBeans.UtenteRegistrato;

/**
 * Session Bean implementation class RecuperaDatiSession
 */
@Stateless
@RemoteBinding(jndiBinding="RecuperaDatiSessionRemote")
public class RecuperaDatiSession implements RecuperaDatiSessionRemote {
	@PersistenceContext(unitName="swimv2")
	private EntityManager manager;
    public RecuperaDatiSession() {
        // TODO Auto-generated constructor stub
    	
    }

	@Override
	public ArrayList<Abilita> recuperaAbilita() {
		// TODO Auto-generated method stub
		String s = "FROM Abilita";
		Query q = manager.createQuery(s);
		@SuppressWarnings("unchecked")
		ArrayList<Abilita> lista_abilita = (ArrayList<Abilita>) q.getResultList();
		if(lista_abilita.size()==0)
			return null;
		else
			return lista_abilita;
	}

	@Override
	public ArrayList<Amicizia> recuperaAmicizia() {
		String s = "FROM Amicizia";
		Query q = manager.createQuery(s);
		@SuppressWarnings("unchecked")
		ArrayList<Amicizia> lista_amicizie = (ArrayList<Amicizia>) q.getResultList();
		if(lista_amicizie.size()==0)
			return null;
		else
			return lista_amicizie;
	}

	@Override
	public ArrayList<EsperienzaLavorativa> recuperaEsperienzaLavorativa() {
		String s = "FROM EsperienzaLavorativa";
		Query q = manager.createQuery(s);
		@SuppressWarnings("unchecked")
		ArrayList<EsperienzaLavorativa> lista_EsperienzaLavorativa = (ArrayList<EsperienzaLavorativa>) q.getResultList();
		if(lista_EsperienzaLavorativa.size()==0)
			return null;
		else
			return lista_EsperienzaLavorativa;
	}

	@Override
	public ArrayList<Feedback> recuperaFeedback() {
		String s = "FROM Feedback";
		Query q = manager.createQuery(s);
		@SuppressWarnings("unchecked")
		ArrayList<Feedback> listaFeedback = (ArrayList<Feedback>) q.getResultList();
		if(listaFeedback.size()==0)
			return null;
		else
			return listaFeedback;
		}

	@Override
	public ArrayList<Indirizzo> recuperaIndirizzo() {
		String s = "FROM Indirizzo";
		Query q = manager.createQuery(s);
		@SuppressWarnings("unchecked")
		ArrayList<Indirizzo> listaIndirizzo = (ArrayList<Indirizzo>) q.getResultList();
		if(listaIndirizzo.size()==0)
			return null;
		else
			return listaIndirizzo;
	}

	@Override
	public ArrayList<Necessita> recuperaNecessitaa() {
		String s = "FROM Necessita";
		Query q = manager.createQuery(s);
		@SuppressWarnings("unchecked")
		ArrayList<Necessita> listaNecessita = (ArrayList<Necessita>) q.getResultList();
		if(listaNecessita.size()==0)
			return null;
		else
			return listaNecessita;
	}

	@Override
	public ArrayList<PossessoAbilita> recuperaPossessoAbilita() {
		String s = "FROM PossessoAbilita";
		Query q = manager.createQuery(s);
		@SuppressWarnings("unchecked")
		ArrayList<PossessoAbilita> listaPossessoAbilita = (ArrayList<PossessoAbilita>) q.getResultList();
		if(listaPossessoAbilita.size()==0)
			return null;
		else
			return listaPossessoAbilita;
	}

	@Override
	public ArrayList<RichiestaAiuto> recuperaRichiestaAiuto() {
		String s = "FROM RichiestaAiuto";
		Query q = manager.createQuery(s);
		@SuppressWarnings("unchecked")
		ArrayList<RichiestaAiuto> listaRichiestaAiuto = (ArrayList<RichiestaAiuto>) q.getResultList();
		if(listaRichiestaAiuto.size()==0)
			return null;
		else
			return listaRichiestaAiuto;
	}
	

	@Override
	public ArrayList<RichiestaAmicizia> recuperaRichiestaAmicizia() {
		String s = "FROM RichiestaAmicizia";
		Query q = manager.createQuery(s);
		@SuppressWarnings("unchecked")
		ArrayList<RichiestaAmicizia> listaRichiestaAmicizia = (ArrayList<RichiestaAmicizia>) q.getResultList();
		if(listaRichiestaAmicizia.size()==0)
			return null;
		else
			return listaRichiestaAmicizia;
	}

	@Override
	public ArrayList<UtenteRegistrato> recuperaUtenteRegistrato() {
		String s = "FROM UtenteRegistrato";
		Query q = manager.createQuery(s);
		@SuppressWarnings("unchecked")
		ArrayList<UtenteRegistrato> listaUtenteRegistrato = (ArrayList<UtenteRegistrato>) q.getResultList();
		if(listaUtenteRegistrato.size()==0)
			return null;
		else
			return listaUtenteRegistrato;
	}
	
	@Override
	public void aggiuntaRichiestaAmicizia(String idAmico1, String idAmico2){
		RichiestaAmicizia nuovaRichiesta = new RichiestaAmicizia();
		nuovaRichiesta.setIdutentemandante(idAmico1);
		nuovaRichiesta.setIdutentericevente(idAmico2);
		manager.persist(nuovaRichiesta);
	}

	@Override
	public void aggiuntaFeedback(String idSessione, String idRichiesta,String commento, String voto) {
		Feedback nuovoFeedback = new Feedback();
//		Calendar cal = Calendar.getInstance();
//    	cal.getTime();
//    	SimpleDateFormat sdfHour = new SimpleDateFormat("HH:mm:ss");
//    	SimpleDateFormat sdfDate = new SimpleDateFormat("Y-M-d");
		
		nuovoFeedback.setIdutentedatore(idSessione);
		nuovoFeedback.setIdutentelavoratore(idRichiesta);
		nuovoFeedback.setVoto(Integer.parseInt(voto));
		nuovoFeedback.setCommento(commento);
		nuovoFeedback.setData(dataCorrente());
		manager.persist(nuovoFeedback);
		
	}

	
	@Override
	public void modificaIndirizzoUtente(String idUtente, String nomeVia,
			String numeroCivico, int cap) {
		
		String s = "UPDATE UtenteRegistrato SET nomevia=:nomeVia, numerocivico=:numeroCivico, cap=:cap WHERE id=:idUtente";
		Query q = manager.createQuery(s);
		q.setParameter("nomeVia", nomeVia);
		q.setParameter("numeroCivico", numeroCivico);
		q.setParameter("cap", cap);
		q.setParameter("idUtente", idUtente);
		q.executeUpdate();
		manager.flush();
	}
	
	@Override
	public void aggiungiIndirizzo(String nomeVia, String numeroCivico, int cap,
			String nazione, String paese, String regione) {
		
		Indirizzo nuovoIndirizzo = new Indirizzo();
		nuovoIndirizzo.setNomevia(nomeVia);
		nuovoIndirizzo.setCap(cap);
		nuovoIndirizzo.setNumerocivico(numeroCivico);
		nuovoIndirizzo.setNazione(nazione);
		nuovoIndirizzo.setPaese(paese);
		nuovoIndirizzo.setRegione(regione);
		
		manager.persist(nuovoIndirizzo);
	
	}
	
	@Override
	public void aggiungiEsperienza(String idSessione, String aziendaModifica,
			String posizioneModifica, String ggInizioModifica,
			String mmInizioModifica, String aaInizioModifica,
			String ggFineModifica, String mmFineModifica, String aaFineModifica) {
		
		EsperienzaLavorativa nuovaEsperienza = new EsperienzaLavorativa();
		
		nuovaEsperienza.setIdutente(idSessione);
		nuovaEsperienza.setPosizione(posizioneModifica);
		nuovaEsperienza.setAzienda(aziendaModifica);
		nuovaEsperienza.setDatainizio(new Date(Integer.parseInt(aaInizioModifica), Integer.parseInt(mmInizioModifica), Integer.parseInt(ggInizioModifica)));
		nuovaEsperienza.setDatafine(new Date(Integer.parseInt(aaFineModifica), Integer.parseInt(mmFineModifica), Integer.parseInt(ggFineModifica)));
		nuovaEsperienza.setId(Integer.toString(generazioneCasualeId()));
		
		manager.persist(nuovaEsperienza);
	}
	
	@Override
	public void eliminaEsperienza(String idEsperienza) {
		
		String s = "DELETE FROM EsperienzaLavorativa e WHERE e.id=:idEsperienza";
		Query q = manager.createQuery(s);
		q.setParameter("idEsperienza", idEsperienza);
		q.executeUpdate();
		manager.flush();
		
	}

	@Override
	public void aggiuntaPossessoAbilita(String idUtente, String idAbilitaNonPosseduta) {
		PossessoAbilita nuovoPossessoAbilita = new PossessoAbilita();
		nuovoPossessoAbilita.setIdutente(idUtente);
		nuovoPossessoAbilita.setIdabilita(idAbilitaNonPosseduta);
		manager.persist(nuovoPossessoAbilita);
		
	}
	
	@Override
	public void eliminaPossessoAbilita(String idUtente,
			String idAbilita){
		
		String s = "DELETE FROM PossessoAbilita p WHERE (p.idutente=:idUtente AND p.idabilita=:idAbilita)";
		Query q = manager.createQuery(s);
		q.setParameter("idUtente", idUtente);
		q.setParameter("idAbilita", idAbilita);
		q.executeUpdate();
		manager.flush();
		
	}
	
	//INIZIO PARTE MODIFICATA DA NAZA
	public void aggiungiAbilita(String nome, String descrizione){
		Abilita nuovaAbilita = new Abilita();
		
		nuovaAbilita.setNome(nome);
		nuovaAbilita.setDescrizione(descrizione);
		nuovaAbilita.setId(Integer.toString(generazioneCasualeId()));
		nuovaAbilita.setAccettata(false);
		
		manager.persist(nuovaAbilita);
	}
	//FINE PARTE MODIFICATA DA NAZA
	
	
	
	@Override
	public void aggiungiRichiestaAiuto(String idSessione, String idRichiesta,
			String descrizioneAiuto) {
		
		RichiestaAiuto nuovaRichiestaAiuto = new RichiestaAiuto();
		Date dataEsatta = dataCorrente();
		
		nuovaRichiestaAiuto.setIdutentelavoratore(idRichiesta);
		nuovaRichiestaAiuto.setIdutentedatore(idSessione);
		nuovaRichiestaAiuto.setDescrizione(descrizioneAiuto);
		nuovaRichiestaAiuto.setData(dataEsatta);
		nuovaRichiestaAiuto.setOra(new Time(dataEsatta.getHours(), dataEsatta.getMinutes(), dataEsatta.getSeconds()));
		
		manager.persist(nuovaRichiestaAiuto);
	}
	
	
	//Metodo che calcola la data e l'ora corrente
	public Date dataCorrente() {

	int anno = Calendar.getInstance().get(Calendar.YEAR);
	int mese = Calendar.getInstance().get(Calendar.MONTH);
	int giorno = Calendar.getInstance().get(Calendar.DATE);
	int ore = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
	int minuti = Calendar.getInstance().get(Calendar.MINUTE);
	int secondi = Calendar.getInstance().get(Calendar.SECOND);

	@SuppressWarnings("deprecation")
	Date date = new Date((anno - 1900), mese, giorno, ore, minuti, secondi);
	return date;

	}
	
	private int generazioneCasualeId() {
		/*Time timeClass = new Time(0);
		long time = timeClass.getTime();
		return time;*/
		int casual = 0;
		Random rand = new Random();
		casual = rand.nextInt();
		while(casual<0)
			casual = rand.nextInt();
		return casual;
	}

}
